home *** CD-ROM | disk | FTP | other *** search
/ The Programmer Disk / The Programmer Disk (Microforum).iso / xpro / pascal3 / pro11 / convertb.pas < prev    next >
Pascal/Delphi Source File  |  1987-06-10  |  4KB  |  148 lines

  1. program convertb ;
  2.   { Converts a Turbo data file created under CP/M to Dos format.
  3.     Reads the first four bytes of the file, two integers which
  4.     represent the number of records and the record length, computes
  5.     the length of the file in bytes, then reads that many bytes and
  6.     writes them to a new file.
  7.  
  8.     Uses blockread to buffer reads of input file.
  9.  
  10.     William Meacham, 1004 Elm Street, Austin, Tx 78703
  11.     Revised: 6/10/87 }
  12.  
  13. {$v-}
  14.  
  15. const
  16.     numreadsectors = 32 ;    { number of sectors to read }
  17.     rblocksize     = 128 ;   { size of one block }
  18.     readbufsize    = 4096 ;  { rblocksize * numreadsectors }
  19.  
  20. type
  21.     intbytes = record case integer of
  22.                 1: (i:integer) ;
  23.                 2: (b1,b2:byte)
  24.               end ;
  25.  
  26.      fname  = string[56] ;   { filename -- can include path, etc. }
  27.  
  28.     rstr80         = string[80] ;
  29.     diskreadbuf    = array [1..readbufsize] of byte ;
  30.  
  31. var
  32.     outf      : file of byte ;
  33.     in_fname,
  34.     out_fname : fname ;
  35.     num_recs,
  36.     rec_len   : intbytes ;
  37.     file_len,
  38.     num,
  39.     len,
  40.     r         : real ;
  41.     b         : byte ;
  42.  
  43.     readbuf        : diskreadbuf ;  { buffer for reading file }
  44.     readptr        : integer ;      { pointer into buffer }
  45.     sourcefile     : file ;
  46.     maxcharstoread : integer ;      { limit to measure max buffer size }
  47.     allcharsread,                   { whether all chars in buffer have been read }
  48.     allblocksread  : boolean ;      { whether all blocks have been read into buffer }
  49.  
  50. { ======================================== }
  51.  
  52. procedure bufread (var b:byte) ;
  53.   { gets one byte }
  54.  
  55.   procedure readnextblock ;
  56.  
  57.   var
  58.       numsectorsread : integer ;  { number of sectors actually read }
  59.  
  60.   begin
  61.       blockread (sourcefile,readbuf,numreadsectors,numsectorsread) ;
  62.       if numsectorsread < numreadsectors then
  63.         begin
  64.           allblocksread := true ;
  65.           maxcharstoread := numsectorsread * rblocksize
  66.         end ;
  67.       if numsectorsread = 0 then
  68.         begin
  69.           allcharsread := true ;
  70.           maxcharstoread := 0
  71.         end ;
  72.       readptr := 1
  73.   end ; { proc readnextblock }
  74.  
  75.   { -------------------- }
  76.  
  77. begin { proc bufread }
  78.     if readptr > readbufsize then
  79.         readnextblock ;
  80.     if allblocksread and (readptr > maxcharstoread) then
  81.         allcharsread := true ;
  82.     if not allcharsread then
  83.       begin
  84.         b       := readbuf[readptr] ;
  85.         readptr := succ(readptr) ;
  86.       end
  87.     else
  88.         b := $00
  89. end ; { proc bufread }
  90.  
  91. { ======================================== }
  92.  
  93. procedure opensourcefile (sfname : rstr80) ;
  94.  
  95. begin
  96.     assign (sourcefile,sfname) ;
  97.     reset  (sourcefile) ;
  98.     allcharsread  := false ;
  99.     allblocksread := false ;
  100.     readptr       := readbufsize + 1 ;  { forces read of first buffer }
  101. end ;  { proc opensourcefile }
  102.  
  103. { ======================================== }
  104.  
  105. procedure closesourcefile ;
  106.  
  107. begin
  108.     close (sourcefile)
  109. end ;  { proc closesourcefile }
  110.  
  111. { ======================================== }
  112.  
  113. begin
  114.    lowvideo ;
  115.    writeln ('This converts a CP/M-format Turbo data file') ;
  116.    writeln ('to a DOS-format data file.') ;
  117.    write   (' Input file name: ') ;
  118.    readln  (in_fname) ;
  119.    write   ('Output file name: ') ;
  120.    readln  (out_fname) ;
  121.    opensourcefile (in_fname) ;
  122.    assign (outf,out_fname) ;
  123.    rewrite (outf) ;
  124.  
  125.    bufread (num_recs.b1) ;
  126.    bufread (num_recs.b2) ;
  127.    bufread (rec_len.b1) ;
  128.    bufread (rec_len.b2) ;
  129.    writeln ('Num_recs = ',num_recs.i) ;
  130.    writeln ('Rec_len  = ',rec_len.i) ;
  131.    num := num_recs.i ;                     { convert to real }
  132.    len := rec_len.i ;
  133.    file_len := num * len ;
  134.    writeln ('File_len = ',file_len:8:0) ;
  135.  
  136.    r := 1 ;
  137.    while r <= file_len do
  138.      begin
  139.        bufread (b) ;
  140.        write (outf,b) ;
  141.        r := r + 1.0
  142.      end ;
  143.  
  144.    closesourcefile ;
  145.    close(outf) ;
  146.    writeln ('Done!',^G)
  147. end.
  148.